﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionePolveriLib.Facades;
using GestionePolveriLib.BL;
using ControlsLib;
using FluentValidation;
using GestionePolveriLib.Validations;

namespace GestionePolveri2.Editors
{
    public partial class ScaricoEditor : Form
    {
        public event EventHandler LoadData;

        private bool m_isClosable = true;
        private string m_function = null;
        private Turno m_turno = null;
        private POS m_currentPOS = null;
        private Impianto m_impianto = null;
        private bool m_turnoEnabled = false;
        private bool m_impiantoEnabled = false;

        private EditorStatus m_editorStatus = EditorStatus.Insert;
        private DateTime m_dataRegistrazione = DateTime.Now;
        private DateTime m_dataMovimento = DateTime.MinValue;

        public DateTime DataMovimento
        {
            get 
            {
                m_dataMovimento = this.scaricoDettaglio1.DataMovimento;

                return m_dataMovimento; 
            }
            set 
            { 
                m_dataMovimento = value;

                this.scaricoDettaglio1.DataMovimento = m_dataMovimento;
            }
        }

        public bool TurnoEnabled
        {
            get { return m_turnoEnabled; }
            set 
            { 
                m_turnoEnabled = value;

                if (this.Principal.IsInRole("Amministrazione"))
                {
                    m_turnoEnabled = true;
                }

                this.scaricoDettaglio1.TurniEnabled = m_turnoEnabled;
            }
        }

        public bool ImpiantoEnabled
        {
            get { return m_impiantoEnabled; }
            set
            {
                m_impiantoEnabled = value;

                this.scaricoDettaglio1.ImpiantiEnabled = m_impiantoEnabled;
            }
        }

        public Impianto Impianto
        {
            get { return m_impianto; }
            set 
            { 
                m_impianto = value;

                this.scaricoDettaglio1.Impianto = m_impianto;
            }
        }

        public Turno Turno
        {
            get { return m_turno; }
            set 
            { 
                m_turno = value;

                this.scaricoDettaglio1.Turno = m_turno;
            }
        }

        public DateTime DataRegistrazione
        {
            get { return m_dataRegistrazione; }
            set { m_dataRegistrazione = value; }
        }

        public EditorStatus EditorStatus
        {
            get { return m_editorStatus; }
            set { m_editorStatus = value; }
        }

        public OperatorePrincipal Principal
        {
            get { return this.scaricoDettaglio1.Principal; }
            set
            {
                if (value != null)
                {
                    this.scaricoDettaglio1.Principal = value;
                }
                else
                {
                    throw new ArgumentNullException("Attenzione: Utente non impostato !");
                }
            }
        }

        public Movimento Movimento
        {
            get { return this.scaricoDettaglio1.Movimento; }
            set
            {
                if (value != null)
                {
                    this.scaricoDettaglio1.Movimento = value;

                    if (this.scaricoDettaglio1.Movimento.Partita == null)
                    {
                        PartiteFacade pf = new PartiteFacade();
                        PartitaInfo pInfo = pf.GetByMovimento(this.scaricoDettaglio1.Movimento.IDMovimento);
                        this.scaricoDettaglio1.Movimento.Partita = pInfo;
                    }
                    else
                    {
                        //this.Turno = this.scaricoDettaglio1.Movimento.Partita.Turno;

                        //this.scaricoDettaglio1.Movimento.Partita.Movimento = this.scaricoDettaglio1.Movimento;
                        this.partiteUC1.PartitaInfo = this.scaricoDettaglio1.Movimento.Partita;
                    }

                    this.numTxtPOS.Text = value.POS.ToString();
                }
            }
        }

        public string Funtion
        {
            set { m_function = value; }
        }

        public ScaricoEditor()
        {
            InitializeComponent();
        }

        public void Initialize()
        {
            this.numTxtPOS.Enabled = false;

            OperatorePrincipal m_OperatorePrincipale = (OperatorePrincipal)System.Threading.Thread.CurrentPrincipal;
            this.btnModPos.Visible = (m_OperatorePrincipale.IsInRole("Amministrazione") || m_OperatorePrincipale.IsInRole("Verniciatura"));

            m_turnoEnabled = m_OperatorePrincipale.IsInRole("Amministrazione");
            m_impiantoEnabled = m_OperatorePrincipale.IsInRole("Amministrazione");

            this.scaricoDettaglio1.InitializeControl();
            this.scaricoDettaglio1.SelectectTurnoChanged += new EventHandler<CustomEventArgs<GestionePolveriLib.BL.Turno>>(scaricoDettaglio1_SelectectTurnoChanged);
            this.scaricoDettaglio1.SelectectImpiantoChanged += new EventHandler<ControlsLib.CustomEventArgs<Impianto>>(scaricoDettaglio1_SelectectImpiantoChanged);
            this.scaricoDettaglio1.LoadData += new EventHandler(scaricoDettaglio1_LoadData);
            this.scaricoDettaglio1.MultipleColorsAssociated += new EventHandler<CustomEventArgs<List<Colore>>>(scaricoDettaglio1_MultipleColorsAssociated);
            this.scaricoDettaglio1.NoColorsAssociated += new EventHandler<CustomEventArgs<List<Colore>>>(scaricoDettaglio1_NoColorsAssociated);
            SetupButtons();

            this.scaricoDettaglio1.DataRegistrazione = m_dataRegistrazione;
        }

        private void SetupButtons()
        {
            switch (EditorStatus)
            {
                case EditorStatus.Insert:
                    this.btnCancella.Visible = false;
                    this.btnSave.Visible = false;
                    this.scaricoDettaglio1.ClearControls();
                    break;
                case EditorStatus.Modifiy:
                    this.btnAdd.Visible = false;
                    break;
                default:
                    break;
            }
        }

        //protected override void OnLoad(EventArgs e)
        //{
        //    //this.partiteUC1.Enabled = false;

        //    base.OnLoad(e);

        //    this.scaricoDettaglio1.InitializeControl();
        //    this.scaricoDettaglio1.SelectectTurnoChanged += new EventHandler<CustomEventArgs<GestionePolveriLib.BL.Turno>>(scaricoDettaglio1_SelectectTurnoChanged);
        //    this.scaricoDettaglio1.SelectectImpiantoChanged += new EventHandler<ControlsLib.CustomEventArgs<Impianto>>(scaricoDettaglio1_SelectectImpiantoChanged);
        //    this.scaricoDettaglio1.LoadData += new EventHandler(scaricoDettaglio1_LoadData);
        //    this.scaricoDettaglio1.MultipleColorsAssociated += new EventHandler<CustomEventArgs<List<Colore>>>(scaricoDettaglio1_MultipleColorsAssociated);
        //    this.scaricoDettaglio1.NoColorsAssociated += new EventHandler<CustomEventArgs<List<Colore>>>(scaricoDettaglio1_NoColorsAssociated);
        //    SetupButtons();

        //    this.scaricoDettaglio1.DataRegistrazione = m_dataRegistrazione;
        //}

        void scaricoDettaglio1_NoColorsAssociated(object sender, CustomEventArgs<List<Colore>> e)
        {
            //if (this.partiteUC1.Enabled)
            {
                if (this.partiteUC1.Colori != null)
                {
                    this.partiteUC1.Colori.Clear();
                }

                this.partiteUC1.AddColoriGenerici = false;
                this.partiteUC1.Colori = e.Item;
            }
        }

        void scaricoDettaglio1_MultipleColorsAssociated(object sender, CustomEventArgs<List<Colore>> e)
        {
            if (this.partiteUC1.Enabled)
            {
                if (e.Item.Where(x => x.CodiceColore.StartsWith("ND")).Count() > 0)
                {
                    ColoriFacade cf = new ColoriFacade();
                    e.Item = cf.GetAllEssential();
                }

                this.partiteUC1.Colori = e.Item;
            }
        }

        public void GeneratePOS()
        {
            this.m_currentPOS = this.scaricoDettaglio1.POS;

            if (m_currentPOS == null)
            {
                m_currentPOS = POS.GetCurrentPOS(m_turno, Principal.Operatore, m_impianto, this.scaricoDettaglio1.DataMovimento);
            }

            if (m_currentPOS != null)
            {
                //POS m_pos = POS.GetCurrentPOS(m_turno, Principal.Operatore, m_impianto, this.scaricoDettaglio1.DataMovimento);

                //if ((m_currentPOS.IDImpianto == m_pos.IDImpianto) &&
                //    (m_currentPOS.IDTurno == m_pos.IDTurno) &&
                //    (m_currentPOS.POSValue < m_pos.POSValue))
                //{
                //    m_currentPOS = m_pos;
                //}

                this.numTxtPOS.Text = m_currentPOS.POSValue.ToString();
                this.numTxtPOS.Visible = true;
            }
        }

        void scaricoDettaglio1_SelectectTurnoChanged(object sender, CustomEventArgs<Turno> e)
        {
            if (e.Item == null) return;

            this.m_turno = e.Item;

            if (this.Movimento == null)
            {
                GeneratePOS();
            }
            else
            {
                if (this.Movimento.IDTurno != e.Item.Id)
                {
                    m_currentPOS = POS.GetCurrentPOS(e.Item, Principal.Operatore, m_impianto, this.scaricoDettaglio1.DataMovimento);
                }
                else
                {
                    if (this.Movimento.IDImpianto != m_impianto.ID)
                    {
                        m_currentPOS = POS.GetCurrentPOS(e.Item, Principal.Operatore, m_impianto, this.scaricoDettaglio1.DataMovimento);
                    }
                    else
                    {
                        m_currentPOS = new POS()
                        {
                            DateOfPos = this.Movimento.DataMovimento,
                            IDImpianto = m_impianto.ID, // this.Movimento.IDImpianto.Value,
                            IDOperatore = this.Movimento.IDOperatore.Value,
                            IDTurno = m_turno.Id,  // (this.Movimento.IDTurno.HasValue ? this.Movimento.IDTurno.Value : (this.Turno != null ? this.Turno.Id : Int16.MinValue)),
                            POSValue = this.Movimento.POS.GetValueOrDefault()
                        };

                        if (m_currentPOS.POSValue == 0)
                        {
                            m_currentPOS = POS.GetCurrentPOS(e.Item, Principal.Operatore, m_impianto, this.scaricoDettaglio1.DataMovimento);
                        }
                    }
                }

                if (m_currentPOS != null)
                {
                    this.numTxtPOS.Text = m_currentPOS.POSValue.ToString();
                    this.numTxtPOS.Visible = true;

                    this.scaricoDettaglio1.POS = m_currentPOS;
                }
                else
                {
                    this.scaricoDettaglio1.ImpiantiEnabled = true;
                }
            }
        }

        void scaricoDettaglio1_SelectectImpiantoChanged(object sender, ControlsLib.CustomEventArgs<Impianto> e)
        {
            if (e.Item == null) return;

            this.m_impianto = e.Item;

            if (this.Movimento == null)
            {
                GeneratePOS();
            }
            else
            {
                if (this.Movimento.IDImpianto != e.Item.ID)
                {
                    m_currentPOS = POS.GetCurrentPOS(m_turno, Principal.Operatore, e.Item, this.scaricoDettaglio1.DataMovimento);
                }
                else
                {
                    if (this.Movimento.IDTurno != m_turno.Id)
                    {
                        m_currentPOS = POS.GetCurrentPOS(m_turno, Principal.Operatore, e.Item, this.scaricoDettaglio1.DataMovimento);
                    }
                    else
                    {
                        m_currentPOS = new POS()
                        {
                            DateOfPos = this.Movimento.DataMovimento,
                            IDImpianto = m_impianto.ID, // this.Movimento.IDImpianto.Value,
                            IDOperatore = this.Movimento.IDOperatore.Value,
                            IDTurno = m_turno.Id,  // (this.Movimento.IDTurno.HasValue ? this.Movimento.IDTurno.Value : (this.Turno != null ? this.Turno.Id : Int16.MinValue)),
                            POSValue = this.Movimento.POS.GetValueOrDefault()
                        };

                        if (m_currentPOS.POSValue == 0)
                        {
                            m_currentPOS = POS.GetCurrentPOS(m_turno, Principal.Operatore, e.Item, this.scaricoDettaglio1.DataMovimento);
                        }
                    }
                }
            }

            if (m_currentPOS != null)
            {
                this.numTxtPOS.Text = m_currentPOS.POSValue.ToString();
                this.numTxtPOS.Visible = true;

                this.scaricoDettaglio1.POS = m_currentPOS;
            }
            else
            {
                this.scaricoDettaglio1.ImpiantiEnabled = true;
            }
        }

        void scaricoDettaglio1_LoadData(object sender, EventArgs e)
        {
            if (LoadData != null)
            {
                LoadData(this, EventArgs.Empty);
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            e.Cancel = !m_isClosable;
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            this.Close();
            m_isClosable = true;
        }

        #region nuovi metodi Add, Modify, Delete
        /// <summary>
        /// Inserimento...
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdd_Click(object sender, EventArgs e)
        {
            m_isClosable = false;

            PartitaInfo m_partitaInfo = this.partiteUC1.GetPartitaInfo();
            Movimento m_movimento = this.scaricoDettaglio1.GetMovimento();

            if (m_movimento.LottoNCInfo == null)
            {
                LottoNCFacade lncf = new LottoNCFacade();
                LottoNCInfo m_lottoNCInfo = lncf.GetLottoNC(m_movimento.IDLotto);
                m_movimento.LottoNCInfo = m_lottoNCInfo;

                if (m_movimento.Lotto != null)
                {
                    m_movimento.Lotto.LottoNCInfo = m_lottoNCInfo;
                }
            }

            if (m_movimento.POS == null)
            {
                if (m_currentPOS != null)
                {
                    m_movimento.POS = m_currentPOS.POSValue;
                }
            }

            //if (m_movimento.LottoNCInfo == null)
            //{
            //    LottoNCFacade lncf = new LottoNCFacade();
            //    LottoNCInfo m_lottoNCInfo = lncf.GetLottoNC(m_movimento.IDLotto);
            //    m_movimento.LottoNCInfo = m_lottoNCInfo;
            //    m_movimento.Lotto.LottoNCInfo = m_lottoNCInfo;
            //}

            GestionePolveriLib.Validations.PartitaInfoValidator validator = new GestionePolveriLib.Validations.PartitaInfoValidator();
            FluentValidation.Results.ValidationResult result = validator.Validate(m_partitaInfo);

            GestionePolveriLib.Validations.MovimentoValidator validatorMov = new GestionePolveriLib.Validations.MovimentoValidator();
            
            if (this.EditorStatus == Editors.EditorStatus.Modifiy)
            {
                validatorMov = new GestionePolveriLib.Validations.MovimentoValidator(this.scaricoDettaglio1.GetPeso());
            }

            FluentValidation.Results.ValidationResult resultMov = validatorMov.Validate(m_movimento);

            if ((!result.IsValid) || (!resultMov.IsValid))
            {
                // qulcosa di non valido è stato trovato !!!
                m_isClosable = false;

                StringBuilder sb = new StringBuilder();
                foreach (FluentValidation.Results.ValidationFailure er in result.Errors)
                {
                    sb.AppendFormat("{0}\n", er.ErrorMessage);
                }

                foreach (FluentValidation.Results.ValidationFailure er in resultMov.Errors)
                {
                    sb.AppendFormat("{0}\n", er.ErrorMessage);
                }

                MessageBox.Show(sb.ToString(), "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                if (m_movimento.LottoNCInfo == null)
                {
                    LottoNCFacade lncf = new LottoNCFacade();
                    LottoNCInfo m_lottoNCInfo = lncf.GetLottoNC(m_movimento.IDLotto);
                    m_movimento.LottoNCInfo = m_lottoNCInfo;
                    m_movimento.Lotto.LottoNCInfo = m_lottoNCInfo;
                }

                MovimentoValidationArgs m_movimentoValidationArgs = this.scaricoDettaglio1.GetMovimentoValidationArgs(ScaricoDettaglio.OperationMode.Insert);

                MovimentoValidationArgsValidator mvav = new MovimentoValidationArgsValidator();
                FluentValidation.Results.ValidationResult resultMvav = mvav.Validate(m_movimentoValidationArgs);

                if (!resultMvav.IsValid)
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (FluentValidation.Results.ValidationFailure vf in resultMvav.Errors)
                    {
                        sb.AppendLine(vf.ErrorMessage);
                    }

                    MessageBox.Show(sb.ToString(), "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Stop);

                    m_isClosable = false;
                    return;
                }

                using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
                {
                    MovimentiFacade mf = new MovimentiFacade();
                    LottoFacade lf = new LottoFacade();

                    mf.AddMovimento(m_movimento);

                    // gestione dello stato di movimentazione del lotto...
                    lf.UpdateStatoMovimentazione(m_movimento.IDLotto, true);

                    //Aggiorno la giacenza lotto
                    lf.AggLotto(m_movimento.IDLotto, m_movimento.Quantita);

                    //////-----------------------------------------------------

                    ImpiantoFacade impf = new ImpiantoFacade();
                    Impianto imp = impf.GetImpianto(m_movimento.IDImpianto.GetValueOrDefault());

                    if (m_currentPOS != null)
                    {
                        POSTableFacade ptf = new POSTableFacade();
                        ptf.UpdatePOS(m_turno, Principal.Operatore, imp, m_currentPOS, m_movimento.DataMovimento);
                    }

                    if (m_partitaInfo != null)
                    {
                        m_partitaInfo.Movimento = m_movimento;
                        m_partitaInfo.POS = m_currentPOS;

                        PartiteFacade pf = new PartiteFacade();
                        pf.Add(m_partitaInfo);
                    }

                    transaction.Complete();

                    m_isClosable = true;
                    this.Close();
                }
            }
        }

        /// <summary>
        /// modifica....
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            m_isClosable = false;

            PartitaInfo m_partitaInfo = this.partiteUC1.GetPartitaInfo();
            Movimento m_movimento = this.scaricoDettaglio1.GetMovimento();

            if (m_movimento == null) return;

            //
            if(m_movimento.Partita == null) m_movimento.Partita = m_partitaInfo;

            GestionePolveriLib.Validations.PartitaInfoValidator validator = new GestionePolveriLib.Validations.PartitaInfoValidator();
            FluentValidation.Results.ValidationResult result = validator.Validate(m_partitaInfo);

            GestionePolveriLib.Validations.MovimentoValidator validatorMov = null;
            if (this.EditorStatus == Editors.EditorStatus.Insert)
            {
                validatorMov = new GestionePolveriLib.Validations.MovimentoValidator();
            }
            else
            {
                validatorMov = new GestionePolveriLib.Validations.MovimentoValidator(this.Movimento.Quantita_old);
            }

            FluentValidation.Results.ValidationResult resultMov = validatorMov.Validate(m_movimento);

            if ((!result.IsValid) || (!resultMov.IsValid))
            {
                m_isClosable = false;

                StringBuilder sb = new StringBuilder();
                foreach (FluentValidation.Results.ValidationFailure er in result.Errors)
                {
                    sb.AppendFormat("{0}\n", er.ErrorMessage);
                }

                foreach (FluentValidation.Results.ValidationFailure er in resultMov.Errors)
                {
                    sb.AppendFormat("{0}\n", er.ErrorMessage);
                }

                MessageBox.Show(sb.ToString(), "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                MovimentoValidationArgs m_movimentoValidationArgs = this.scaricoDettaglio1.GetMovimentoValidationArgs(ScaricoDettaglio.OperationMode.Insert);

                MovimentoValidationArgsValidator mvav = new MovimentoValidationArgsValidator();
                FluentValidation.Results.ValidationResult resultMvav = mvav.Validate(m_movimentoValidationArgs);

                if (!resultMvav.IsValid)
                {
                    m_isClosable = false;
                    return;
                }

                POSTableFacade ptf = new POSTableFacade();

                using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
                {
                    if (this.numTxtPOS.Enabled)
                    {
                        int m_pos = int.Parse(this.numTxtPOS.Text);
                        if (ptf.CheckDuplicate(m_pos, m_turno.Id, m_movimento.ImpiantoInternal.ID, m_movimento.DataMovimento))
                        {
                            if (MessageBox.Show("POS già presente.\nVuoi procedere comunque alla modifica del POS ?", "Gestione Polveri",
                                                 MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                            {
                                m_movimento.POS = m_pos;
                            }
                        }
                        else
                        {
                            m_movimento.POS = m_pos;
                        }

                        m_currentPOS = ptf.GetCurrentPOS(m_turno, Principal.Operatore, m_movimento.ImpiantoInternal, m_movimento.DataMovimento);
                        m_currentPOS.POSValue = m_pos;
                    }

                    // modifica di un movimento già inserito in una data differente...
                    if (this.scaricoDettaglio1.DataMovimentoChanged)
                    {
                        if (this.scaricoDettaglio1.DataMovimentoChangedBag != null)
                        {
                            DataMovimentoChangedBag m_bag = this.scaricoDettaglio1.DataMovimentoChangedBag;
                            // aggiorno il vecchio POS...
                            m_bag.OriginalPOS.POSValue = m_bag.OriginalPOS.POSValue - 1;
                            ptf.UpdatePOS(m_bag.OriginalTurno, Principal.Operatore, m_bag.OriginalImpianto, m_bag.OriginalPOS, m_bag.OriginalDate);

                            // aggiorno il nuovo POS con cui salvare il movimento...
                            POS m_newPOS = ptf.GetCurrentPOS(m_bag.NewTurno, Principal.Operatore, m_bag.NewImpianto, m_bag.NewDate);

                            ptf.UpdatePOS(m_bag.NewTurno, Principal.Operatore, m_bag.NewImpianto, m_newPOS, m_bag.NewDate);
                            this.Movimento.POS = m_newPOS.POSValue;
                        }
                    }

                    MovimentiFacade impf = new MovimentiFacade();
                    impf.ModifyMovimento(m_movimento);

                    //Ripristino giacenza lotto vecchio...                                                            
                    LottoFacade lot = new LottoFacade();
                    lot.RipristinoLotto(this.scaricoDettaglio1.OldMovimento.IDLotto, this.scaricoDettaglio1.OldMovimento.Quantita);

                    //Aggiorno la giacenza lotto nuovo...
                    lot.AggLotto(m_movimento.IDLotto, m_movimento.Quantita);

                    if (m_currentPOS != null)
                    {
                        ptf.UpdatePOS(m_turno, Principal.Operatore, m_movimento.ImpiantoInternal, m_currentPOS, m_movimento.DataMovimento);
                    }

                    if (m_partitaInfo != null)
                    {
                        m_partitaInfo.Movimento = m_movimento;

                        PartiteFacade pf = new PartiteFacade();
                        pf.AddOrModify(m_partitaInfo);
                    }

                    transaction.Complete();

                    m_isClosable = true;
                    this.Close();
                }
            }
        }

        /// <summary>
        /// Cancellazione...
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCancella_Click(object sender, EventArgs e)
        {
            OperatorePrincipal m_OperatorePrincipale = (OperatorePrincipal)System.Threading.Thread.CurrentPrincipal;
            if (!m_OperatorePrincipale.IsInRole("Amministrazione"))
            {
                if (m_function == "C")
                {
                    MessageBox.Show("Funzione non abilitata per l'utente !");
                    return;
                }
            }

            if (MessageBox.Show("Stai cancellando uno scarico. Vuoi procedere ?", "Carico Movimenti", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == System.Windows.Forms.DialogResult.Yes)
            {
                //PartitaInfo m_partitaInfo = this.partiteUC1.GetPartitaInfo();
                //Movimento m_movimento = this.scaricoDettaglio1.GetMovimento();

                using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
                {
                    try
                    {
                        MovimentiFacade mf = new MovimentiFacade();
                        LottoFacade lot = new LottoFacade();

                        lot.RipristinoLotto(this.scaricoDettaglio1.OldMovimento.IDLotto, this.scaricoDettaglio1.OldMovimento.Quantita);

                        PartitaInfo m_partitaInfo = new PartitaInfo();
                        m_partitaInfo.Movimento = this.Movimento;
                        PartiteFacade pf = new PartiteFacade();
                        pf.Delete(m_partitaInfo);

                        mf.DeleteFisicaMovimento(this.Movimento);

                        lot.CheckStatoMovimentazione(this.Movimento.IDLotto);

                        transaction.Complete();

                        MessageBox.Show("Cancellazione Effettuata con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Errore! Cancellazione Fallita.", 
                            "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }

                this.Close();

                //m_isClosable = this.scaricoDettaglio1.Delete();

                //if (m_isClosable)
                //{
                //    this.Close();
                //}
            }
        }

        private bool CheckMovimentoValidationArgs(MovimentoValidationArgs m_movimentoValidationArgs)
        {
            bool retValue = true;

            if (m_movimentoValidationArgs.GiacenzaTotaleInsufficienteFlag)
            {
                //.......ERRORE: Giacenza totale insufficiente
                if (MessageBox.Show("Attenzione!...Giacenza totale insufficiente. Continuare?",
                                   "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return false;
                }
            }

            if (m_movimentoValidationArgs.GiacenzaLottoInsufficienteFlag)
            {
                //.......ERRORE: Giacenza lotto insufficiente
                if (MessageBox.Show("Attenzione!...Giacenza lotto insufficiente. Continuare?",
                    "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return false;
                }
            }

            if (m_movimentoValidationArgs.SottoScortaFlag)
            {
                //.......ERRORE: Sottoscorta
                if (MessageBox.Show("Attenzione!...Giacenza totale inferiore alla Scorta minima. Continuare?",
                                                         "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return false;
                }
            }

            if (m_movimentoValidationArgs.LottoPiuVecchioSelezionatoFlag)
            {
                if (MessageBox.Show("Attenzione!...Non è stato selezionato il lotto più vecchio. Continuare?",
                                 "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return false;
                }
            }

            if (m_movimentoValidationArgs.LottoScadutoSelezionatoFlag)
            {
                if (MessageBox.Show("Attenzione!...E' stato selezionato un lotto scaduto. Continuare?",
                                                     "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    return false;
                }
            }

            return retValue;
        }
        #endregion

        private void btnModPos_Click(object sender, EventArgs e)
        {
            this.numTxtPOS.Enabled = !this.numTxtPOS.Enabled; 
        }
    }
}
